﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using BadgeManager.Model;

namespace BadgeManager.Controller
{
    public class ctrlPersona
    {
        private Persona persona;
        private ctrlTessera ctrlTessera = new ctrlTessera();
        private Connector connector = Connector.Istance();

        public List<Persona> SelectObjectPersona()
        {
            DataTable data = new DataTable();

            Connector con = Connector.Istance();
            SqlConnection conn = con.Connessione;

            string query = @"
            SELECT     Persone.id AS IdPersona, Persone.cognome AS CognomePersona, Persone.nome AS NomePersona, Persone.note AS NotePersona,Persone.idtessera AS IdTessera, Alunni.id AS IdAlunno, Dipendenti.id AS IdDipendente, Docenti.id AS IdDocente
            FROM       Persone LEFT OUTER JOIN
                       Alunni ON Persone.id = Alunni.id LEFT OUTER JOIN
                       Dipendenti ON Persone.id = Dipendenti.id LEFT OUTER JOIN
                       Docenti ON Persone.id = Docenti.id";
            SqlDataAdapter adapter = new SqlDataAdapter(query, conn);
            adapter.Fill(data);

            List<Persona> listaPersone = new List<Persona>();

            foreach (DataRow riga in data.Rows)
            {
                Persona persona = null;
                if (riga[0].Equals(riga[5])) //alunno
                {
                    persona = new Alunno();
                }
                if (riga[0].Equals(riga[6])) //dipendente
                {
                    persona = new Dipendente();
                }
                if (riga[0].Equals(riga[7])) //docente
                {
                    persona = new Docente();
                }

                persona.Id = (Guid)riga["IdPersona"];
                persona.Cognome = (string)riga["CognomePersona"];
                persona.Nome = (string)riga["NomePersona"];
                persona.Note = (string)riga["NotePersona"];
                ctrlTessera ctrlTessera = new Controller.ctrlTessera();
                if (riga["IdTessera"] != DBNull.Value)
                    persona.Tessera = ctrlTessera.GetTesseraById((Guid)riga["IdTessera"]);
                else
                    persona.Tessera = null;
                listaPersone.Add(persona);
            }
            return listaPersone;
        }

        public List<Persona> SelectAlunniCorsoAttivitàAttuale(Guid idAttività)
        {
            List<Persona> alunni = new List<Persona>();
            DataTable dataTable = new DataTable();
            string query = @" SELECT Persone.id, Persone.nome, Persone.cognome, Attivita.id AS Expr1, Persone.note,
                        Alunni.id, Dipendenti.id, Docenti.id
                  FROM Attivita INNER JOIN
                        Persone ON Attivita.id = Persone.idattivita RIGHT OUTER JOIN
                        Persone AS Persone_1 ON Persone.id = Persone.id LEFT OUTER JOIN
                        Alunni ON Persone.id = Alunni.id LEFT OUTER JOIN
                        Dipendenti ON Persone.id = Dipendenti.id LEFT OUTER JOIN
                        Docenti ON Persone.id = Docenti.id
                  WHERE (Attivita.id = @Param1)
                  GROUP BY Persone.id, Alunni.id, Dipendenti.id, Docenti.id, Persone.nome, Persone.cognome, Attivita.id, Persone.note";

            SqlCommand cmd = new SqlCommand(query, connector.Connessione);
            SqlParameter parm1 = new SqlParameter();
            parm1.ParameterName = "@Param1";
            parm1.DbType = DbType.Guid;
            parm1.Value = idAttività;
            cmd.Parameters.Add(parm1);

            SqlDataAdapter sda = new SqlDataAdapter();
            sda.SelectCommand = cmd;
            sda.Fill(dataTable);
            foreach (DataRow riga in dataTable.Rows)
            {
                Persona alunno = null;
                if (riga[0].Equals(riga[5])) //alunno
                {
                    alunno = new Alunno();
                }
                if (riga[0].Equals(riga[6])) //dipendente
                {
                    alunno = new Dipendente();
                }
                if (riga[0].Equals(riga[7])) //docente
                {
                    alunno = new Docente();
                }
                alunno.Id = (Guid)riga["Id"];
                alunno.Nome = (string)riga["Nome"];
                alunno.Cognome = (string)riga["Cognome"];
                alunni.Add(alunno);
            }
            return alunni;
        }

        public List<Alunno> SelezionaAlunniCheFrequentanoUnCorso(Corso corso)
        {
            List<Alunno> alunni = new List<Alunno>();
            DataTable dataTable = new DataTable();
            string query = @"SELECT Persone.id AS IdPersona, Persone.nome AS Nome, Persone.cognome AS Cognome, Attivita.idcorso AS IdCorso, Corsi.nome AS Corso,
                Tessere.codice AS CodiceTessera
                FROM  Persone INNER JOIN
                Attivita ON Persone.idattivita = Attivita.id INNER JOIN
                Corsi ON Attivita.idcorso = Corsi.id INNER JOIN
                Tessere ON Persone.idtessera = Tessere.id
                WHERE (Attivita.idcorso ='" + corso.Id + "')";

            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            sda.Fill(dataTable);
            foreach (DataRow row in dataTable.Rows)
            {
                Alunno alunno = new Alunno();
                alunno.Id = (Guid)row["IdPersona"];
                alunno.Nome = (string)row["Nome"];
                alunno.Cognome = (string)row["Cognome"];
                alunno.Tessera = new Tessera()
                {
                    Codice = (string)row["CodiceTessera"]
                };
                alunni.Add(alunno);
            }
            return alunni;
        }

        public List<Alunno> SelectAllAlunniNonImpegnati()
        {
            List<Alunno> alunni = new List<Alunno>();
            DataTable data = new DataTable();
            SqlDataAdapter com = new SqlDataAdapter("SELECT Persone.id AS Id, Persone.nome AS Nome, Persone.cognome AS Cognome "
                        + " FROM Persone LEFT JOIN "
                        + " Alunni ON Persone.id = Alunni.id "
                        + " WHERE Persone.idattivita IS NULL ", connector.Connessione);
            com.Fill(data);
            foreach (DataRow row in data.Rows)
            {
                Alunno alunno = new Alunno();
                alunno.Id = (Guid)row["Id"];
                alunno.Nome = (string)row["Nome"];
                alunno.Cognome = (string)row["Cognome"];
                alunni.Add(alunno);
            }
            return alunni;
        }

        public List<Alunno> SelectAllAlunniCorsoFinito()
        {
            DataTable data = new DataTable();
            List<Alunno> alunni = new List<Alunno>();

            SqlDataAdapter com = new SqlDataAdapter("SELECT Persone.id AS Id,Persone.nome AS Nome, Persone.cognome AS Cognome, MAX(DettaglioAttivita.giorno) AS MaxGiorno, Persone.idattivita, Persone.id, Persone.idtessera, Persone.note "
                    + " FROM DettaglioAttivita INNER JOIN "
                    + " Attivita ON DettaglioAttivita.idattivita = Attivita.id RIGHT OUTER JOIN "
                    + " Persone ON Attivita.id = Persone.idattivita "
                    + " GROUP BY Persone.id, Persone.cognome, Persone.nome, Persone.idattivita, Persone.idtessera, Persone.note "
                    + " HAVING (MAX(DettaglioAttivita.giorno) < { fn NOW() }) OR "
                    + " (Persone.idattivita IS NULL)", connector.Connessione);
            com.Fill(data);
            foreach (DataRow row in data.Rows)
            {
                Alunno alunno = new Alunno();
                alunno.Id = (Guid)row["Id"];
                alunno.Nome = (string)row["Nome"];
                alunno.Cognome = (string)row["Cognome"];
                alunni.Add(alunno);
            }
            return alunni; ;
        }

        public DataTable SelectTableAll()
        {
            DataTable data = new DataTable();

            SqlDataAdapter com = new SqlDataAdapter(@"
SELECT       Persone.id As Id, Persone.nome, Persone.cognome, Persone.note, Alunni.id AS idAlunno, Dipendenti.id AS idDipendente, Docenti.id AS idDocente
FROM         Persone LEFT OUTER JOIN
                      Docenti ON Persone.id = Docenti.id LEFT OUTER JOIN
                      Dipendenti ON Persone.id = Dipendenti.id LEFT OUTER JOIN
                      Alunni ON Persone.id = Alunni.id", connector.Connessione);
            com.Fill(data);
            data.Columns.Add("Tipo");

            foreach (DataRow dr in data.Rows)
            {
                if (!string.IsNullOrEmpty(Convert.ToString(dr[3]))) dr["Tipo"] = "Alunno";
                if (!string.IsNullOrEmpty(Convert.ToString(dr[4]))) dr["Tipo"] = "Dipendente";
                if (!string.IsNullOrEmpty(Convert.ToString(dr[5]))) dr["Tipo"] = "Docente";
            }
            return data;
        }

        public Persona SelectObjectPersonaById(Guid idPersona)
        {
            DataTable data = new DataTable();

            string query = @"
            SELECT     Persone.id AS IdPersona, Persone.cognome AS CognomePersona, Persone.nome AS NomePersona, Persone.note AS NotePersona,Persone.idtessera AS IdTessera, Alunni.id AS IdAlunno, Dipendenti.id AS IdDipendente, Docenti.id AS IdDocente
            FROM       Persone LEFT OUTER JOIN
                       Alunni ON Persone.id = Alunni.id LEFT OUTER JOIN
                       Dipendenti ON Persone.id = Dipendenti.id LEFT OUTER JOIN
                       Docenti ON Persone.id = Docenti.id
                       WHERE Persone.id = '" + idPersona + "'";
            SqlDataAdapter adapter = new SqlDataAdapter(query, connector.Connessione);
            adapter.Fill(data);

            // List<Persona> listaPersone = new List<Persona>();

            //  foreach (DataRow riga in data.Rows)
            //  {
            DataRow riga = data.Rows[0];
            Persona persona = null;
            if (riga[0].Equals(riga[5])) //alunno
            {
                persona = new Alunno();
            }
            if (riga[0].Equals(riga[6])) //dipendente
            {
                persona = new Dipendente();
            }
            if (riga[0].Equals(riga[7])) //docente
            {
                persona = new Docente();
            }
            persona.Id = (Guid)data.Rows[0][data.Columns["IdPersona"]];
            persona.Cognome = (string)data.Rows[0][data.Columns["CognomePersona"]];
            persona.Nome = (string)data.Rows[0][data.Columns["NomePersona"]];
            persona.Note = (string)data.Rows[0][data.Columns["NotePersona"]];
            if (data.Rows[0][data.Columns["IdTessera"]] != DBNull.Value)
                persona.Tessera = ctrlTessera.GetTesseraById((Guid)data.Rows[0][data.Columns["IdTessera"]]);
            else
                persona.Tessera = null;
            //}
            this.persona = persona;
            return persona;
        }

        public void DeleteTipologia(Persona persona)
        {
            if (persona is Alunno)
            {
                string query = " DELETE FROM Alunni WHERE id = @condizione";
                SqlCommand elimina = new SqlCommand(query, connector.Connessione);
                elimina.Parameters.AddWithValue("@condizione", persona.Id);
                elimina.ExecuteNonQuery();
            }
            else if (persona is Dipendente)
            {
                string query = " DELETE FROM Dipendenti WHERE id = @condizione";
                SqlCommand elimina = new SqlCommand(query, connector.Connessione);
                elimina.Parameters.AddWithValue("@condizione", persona.Id);
                elimina.ExecuteNonQuery();
            }
            else if (persona is Docente)
            {
                string query = " DELETE FROM Docenti WHERE id = @condizione";
                SqlCommand elimina = new SqlCommand(query, connector.Connessione);
                elimina.Parameters.AddWithValue("@condizione", persona.Id);
                elimina.ExecuteNonQuery();
            }
        }

        public bool DeletePersone(Guid idDaCancellare)
        {
            persona = SelectObjectPersonaById(idDaCancellare);
            DeleteTipologia(persona);
            try
            {
                string queryPersone = " DELETE FROM Persone WHERE id = @condizione";
                SqlCommand eliminaPersone = new SqlCommand(queryPersone, connector.Connessione);
                SqlParameter condizione = new SqlParameter();
                condizione.ParameterName = "@condizione";
                condizione.SqlDbType = SqlDbType.UniqueIdentifier;
                condizione.Value = idDaCancellare;
                eliminaPersone.Parameters.Add(condizione);
                eliminaPersone.ExecuteNonQuery();
                return true;
            }
            catch (SqlException ex)
            {
                if (persona is Alunno)
                {
                    InserisciAlunno(idDaCancellare);
                }
                else if (persona is Dipendente)
                {
                    InserisciDipendente(idDaCancellare);
                }
                else if (persona is Docente)
                {
                    InserisciDocente(idDaCancellare);
                }
                if (ex.Number == 547)
                {
                    throw new PersonaAssociataAdAttività();
                }
                return false;
            }
        }

        public DataTable SelectAll()
        {
            DataTable data = new DataTable();

            SqlDataAdapter com = new SqlDataAdapter("select * from Persone", connector.Connessione);
            com.Fill(data);

            return data;
        }

        public Tessera GetTesseraByCodice(string codice)
        {
            DataTable dataTable = new DataTable();
            Tessera daRitornare = new Tessera();
            string query = "SELECT * FROM Tessere WHERE codice = '" + codice + "'";
            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            sda.Fill(dataTable);

            if (dataTable.Rows.Count > 0)
            {
                daRitornare.Id = (Guid)dataTable.Rows[0]["id"];
                daRitornare.Codice = (string)dataTable.Rows[0]["codice"];
                daRitornare.Abilitata = (bool)dataTable.Rows[0]["abilitata"];
                return daRitornare;
            }
            return null;
        }

        public List<Persona> SelectAlunniNonImpegnati()
        {
            List<Persona> alunni = new List<Persona>();
            DataTable data = new DataTable();

            SqlDataAdapter com = new SqlDataAdapter(@"
            SELECT       Persone.id AS Id, Persone.nome AS Nome, Persone.cognome AS Cognome, MAX(DettaglioAttivita.giorno) AS MaxGiorno, Persone.idattivita,
                         Alunni.id, Dipendenti.id, Docenti.id,
                         Persone.idtessera,
                         Persone.note
            FROM         DettaglioAttivita INNER JOIN
                         Attivita ON DettaglioAttivita.idattivita = Attivita.id RIGHT OUTER JOIN
                         Persone ON Attivita.id = Persone.idattivita RIGHT OUTER JOIN
                         Persone AS Persone_1 ON Persone.id = Persone.id LEFT OUTER JOIN
                         Alunni ON Persone.id = Alunni.id LEFT OUTER JOIN
                         Dipendenti ON Persone.id = Dipendenti.id LEFT OUTER JOIN
                         Docenti ON Persone.id = Docenti.id
            GROUP BY     Persone.id, Persone.cognome, Persone.nome, Persone.idattivita, Persone.idtessera, Persone.note, Alunni.id, Docenti.id, Dipendenti.id
            HAVING       (MAX(DettaglioAttivita.giorno) < { fn NOW() }) OR
                         (Persone.idattivita IS NULL)"
                    + " ", connector.Connessione);
            com.Fill(data);

            foreach (DataRow riga in data.Rows)
            {
                Persona alunno = null;
                if (riga[0].Equals(riga[5])) //alunno
                {
                    alunno = new Alunno();
                }
                if (riga[0].Equals(riga[6])) //dipendente
                {
                    alunno = new Dipendente();
                }
                if (riga[0].Equals(riga[7])) //docente
                {
                    alunno = new Docente();
                }
                alunno.Id = (Guid)riga["Id"];
                alunno.Nome = (string)riga["Nome"];
                alunno.Cognome = (string)riga["Cognome"];
                alunni.Add(alunno);
            }

            return alunni;
        }

        private bool ControllaUnivocitaTessera()
        {
            SqlCommand selectCodiceTessera = new SqlCommand(
                "Select * from Tessere where codice='" + persona.Tessera.Codice + "'"
                , connector.Connessione);

            return true;
        }

        /// <summary>
        /// Inserisce l'id Dell'attività in quella Persona
        /// </summary>
        /// <param name="attivita"></param>
        /// <param name="idPersona"></param>
        /// <returns></returns>
        public int setPersonaToAttivita(Attivita attivita, Guid idPersona)
        {
            string sql;
            sql = "UPDATE Persone SET idattivita='" + attivita.Id + "'"
                + " WHERE id='" + idPersona + "'";
            SqlCommand cmd = new SqlCommand(sql, connector.Connessione);
            if (connector.Transaction != null)
                cmd.Transaction = connector.Transaction;
            return cmd.ExecuteNonQuery();
        }

        public int setPersonaToAttivitaNULL(Attivita attivita, Guid idPersona)
        {
            string sql;
            sql = "UPDATE Persone SET idattivita=NULL"
                + " WHERE id='" + idPersona + "'";
            SqlCommand cmd = new SqlCommand(sql, connector.Connessione);
            return cmd.ExecuteNonQuery();
        }

        private void InserisciDipendente(Guid idPersona)
        {
            SqlCommand insertDip = new SqlCommand(@"
                Insert into Dipendenti
                (id)
                values(@id)
            ", connector.Connessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = idPersona;
            insertDip.Parameters.Add(id);

            insertDip.ExecuteNonQuery();
        }

        private void InserisciAlunno(Guid idPersona)
        {
            SqlCommand insertAlunn = new SqlCommand(@"
                Insert into Alunni
                (id)
                values(@id)
            ", connector.Connessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = idPersona;
            insertAlunn.Parameters.Add(id);

            insertAlunn.ExecuteNonQuery();
        }

        private void InserisciDocente(Guid idPersona)
        {
            SqlCommand insertDoc = new SqlCommand(@"
                Insert into Docenti
                (id)
                values(@id)
            ", connector.Connessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = idPersona;
            insertDoc.Parameters.Add(id);

            insertDoc.ExecuteNonQuery();
        }

        public void UpdatePersona(Persona persona, bool cambioTipo) // da finire
        {
            SqlCommand update = new SqlCommand(@"
                UPDATE Persone set nome = @nome, cognome = @cognome, idtessera = @idtessera, note = @note
                WHERE id = @id
            ", connector.Connessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = persona.Id;
            update.Parameters.Add(id);

            SqlParameter nome = new SqlParameter();

            nome.ParameterName = "@nome";
            nome.DbType = DbType.String;
            nome.Value = persona.Nome;
            update.Parameters.Add(nome);

            SqlParameter cognome = new SqlParameter();

            cognome.ParameterName = "@cognome";
            cognome.DbType = DbType.String;
            cognome.Value = persona.Cognome;
            update.Parameters.Add(cognome);

            SqlParameter idTessera = new SqlParameter();

            if (persona.Tessera != null)
            {
                if (ctrlTessera.ControllaSeAssociata(persona.Tessera) == true)
                    AnnullaAssociazioneTessera(persona.Tessera.Id);
            }

            idTessera.ParameterName = "@idtessera";
            if (persona.Tessera != null)
            {
                idTessera.DbType = DbType.Guid;
                idTessera.Value = persona.Tessera.Id;
            }
            else
                idTessera.Value = DBNull.Value;
            update.Parameters.Add(idTessera);

            SqlParameter note = new SqlParameter();

            note.ParameterName = "@note";
            note.DbType = DbType.String;
            note.Value = persona.Note;
            update.Parameters.Add(note);
            try
            {
                update.ExecuteNonQuery();
            }
            catch (SqlException)
            {
                throw new ImpossibileModificare();
            }
            if (cambioTipo)
            {
                Persona vecchiaPersona = SelectObjectPersonaById(persona.Id);
                DeleteTipologia(vecchiaPersona);
                if (persona is Dipendente)
                {
                    InserisciDipendente(persona.Id);
                }
                else if (persona is Alunno)
                {
                    InserisciAlunno(persona.Id);
                }
                else if (persona is Docente)
                {
                    InserisciDocente(persona.Id);
                }
            }
        }

        public void InsertPersonaTessera(Persona persona)
        {
            SqlCommand insert = new SqlCommand(@"
                Insert into Persone
                (id,nome,cognome,idtessera,note)
                values(@id,@nome,@cognome,@idtessera,@note)
            ", connector.Connessione);

            SqlParameter id = new SqlParameter();

            id.ParameterName = "@id";
            id.DbType = DbType.Guid;
            id.Value = persona.Id;
            insert.Parameters.Add(id);

            SqlParameter nome = new SqlParameter();

            nome.ParameterName = "@nome";
            nome.DbType = DbType.String;
            nome.Value = persona.Nome;
            insert.Parameters.Add(nome);

            SqlParameter cognome = new SqlParameter();

            cognome.ParameterName = "@cognome";
            cognome.DbType = DbType.String;
            cognome.Value = persona.Cognome;
            insert.Parameters.Add(cognome);
            // se esiste già una persona con quella tessera associata allora cancella l'associazione
            if (persona.Tessera != null)
            {
                if (ctrlTessera.ControllaSeAssociata(persona.Tessera) == true)
                    AnnullaAssociazioneTessera(persona.Tessera.Id);
            }

            SqlParameter idTessera = new SqlParameter();

            idTessera.ParameterName = "@idtessera";
            if (persona.Tessera != null)
            {
                idTessera.DbType = DbType.Guid;
                idTessera.Value = persona.Tessera.Id;
            }
            else
                idTessera.Value = DBNull.Value;
            insert.Parameters.Add(idTessera);

            SqlParameter note = new SqlParameter();

            note.ParameterName = "@note";
            note.DbType = DbType.String;
            note.Value = persona.Note;
            insert.Parameters.Add(note);
            try
            {
                insert.ExecuteNonQuery();
                if (persona is Dipendente)
                {
                    InserisciDipendente(persona.Id);
                }
                else if (persona is Alunno)
                {
                    InserisciAlunno(persona.Id);
                }
                else if (persona is Docente)
                {
                    InserisciDocente(persona.Id);
                }
            }
            catch (SqlException)
            {
                throw new ImpossibileInserire();
            }
        }

        public DataTable VerificaPersoneAttivita(Guid id)
        {
            DataTable dt = new DataTable();
            SqlDataAdapter com = new SqlDataAdapter("select cognome, nome from persone where id='" + id + "' ", connector.Connessione);

            com.Fill(dt);

            return dt;
        }

        public void AnnullaAssociazioneTessera(Persona personaPrecedente)
        {
            string query = "Update Persone set idtessera = NULL Where id = '" + personaPrecedente.Id + "'";

            SqlCommand update = new SqlCommand(query, connector.Connessione);
            update.ExecuteNonQuery();
        }

        /// <summary>
        /// Annulla l'associazione che c'è tra persona e Tessera, passando l'id della tessera Stessa
        /// </summary>
        /// <param name="idTessera">Id della tessera da disassociare </param>
        public void AnnullaAssociazioneTessera(Guid idTessera)
        {
            string query = "Update Persone set idtessera = NULL Where idtessera = '" + idTessera + "'";

            SqlCommand update = new SqlCommand(query, connector.Connessione);
            update.ExecuteNonQuery();
        }

        public int UpdateAssciazioneTessera(Tessera tesseraDaAssociare, Guid idPersona)
        {
            string query = "UPDATE Persone Set idtessera = @idtessera WHERE id = @id";
            SqlCommand update = new SqlCommand(query, connector.Connessione);

            if (ctrlTessera.ControllaSeAssociata(persona.Tessera) == true)
                AnnullaAssociazioneTessera(persona.Tessera.Id);

            SqlParameter idtessera = new SqlParameter();
            idtessera.DbType = DbType.Guid;
            idtessera.ParameterName = "@idtessera";
            idtessera.Value = tesseraDaAssociare.Id;
            update.Parameters.Add(idtessera);

            SqlParameter id = new SqlParameter();
            id.DbType = DbType.Guid;
            id.ParameterName = "@id";
            id.Value = idPersona;
            update.Parameters.Add(id);

            return update.ExecuteNonQuery();
        }

        public void setPersonaToAttivitaNULL(Guid guid)
        {
            string sql;
            sql = "UPDATE Persone SET idattivita=NULL"
                + " WHERE idattivita='" + guid + "'";
            SqlCommand cmd = new SqlCommand(sql, connector.Connessione);
            cmd.ExecuteNonQuery();
        }

        public bool ControllaSeAssociatoACorsoFinito(Guid idPersona)
        {
            string query = @"SELECT Persone.id AS Id,Persone.nome AS Nome, Persone.cognome AS Cognome, MAX(DettaglioAttivita.giorno) AS MaxGiorno, Persone.idattivita, Persone.id, Persone.idtessera, Persone.note "
                    + " FROM DettaglioAttivita INNER JOIN "
                    + " Attivita ON DettaglioAttivita.idattivita = Attivita.id RIGHT OUTER JOIN "
                    + " Persone ON Attivita.id = Persone.idattivita "
                    + " WHERE Persone.id = '" + idPersona + "'"
                    + " GROUP BY Persone.id, Persone.cognome, Persone.nome, Persone.idattivita, Persone.idtessera, Persone.note "
                    + " HAVING (MAX(DettaglioAttivita.giorno) < { fn NOW() })";
            SqlDataAdapter com = new SqlDataAdapter(query, connector.Connessione);
            DataTable table = new DataTable();
            com.Fill(table);
            if (table.Rows.Count > 0)
            {
                return true;
            }

            return false;
        }

        public bool ControllaSeAssociatoAdAttività(Guid idPersona)
        {
            string query = @"SELECT Persone.idattivita
                            FROM Persone
                            INNER JOIN Attivita ON Persone.idAttivita = Attivita.id
                            INNER JOIN DettaglioAttivita ON Attivita.id = DettaglioAttivita.id
                            WHERE Persone.id ='" + idPersona + @"' AND Persone.idattivita IS NOT NULL
                            GROUP BY Persone.idattivita
                            HAVING (MAX(DettaglioAttivita.giorno) > { fn NOW() })";

            DataTable table = new DataTable();
            SqlDataAdapter sda = new SqlDataAdapter(query, connector.Connessione);
            sda.Fill(table);

            if (table.Rows.Count > 0)
                return false;

            return true;
        }

        public int InserisciPersonaInDocente(Persona Persona)
        {
            string sql = "insert into Docenti (@id)";
            SqlCommand cmd = new SqlCommand(sql, connector.Connessione);
            cmd.Parameters.AddWithValue("@id", (Guid)persona.Id);
            return cmd.ExecuteNonQuery();
        }

        public Docente GetDocenteById(Guid id)
        {
            string sql = @"SELECT  Docenti.id AS IdDocente, Persone.nome AS Nome, Persone.cognome AS Cognome, Persone.idtessera AS IdTessera, Persone.idattivita AS IdAttivita,
                      Persone.note AS Note
                FROM Persone RIGHT OUTER JOIN
                    Docenti ON Persone.id = Docenti.id
                WHERE (Docenti.id = '" + id + "')";
            SqlDataAdapter com = new SqlDataAdapter(sql, connector.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count == 0) { return null; }
            Docente DocenteRitorno = new Docente();
            DocenteRitorno.Id = (Guid)dt.Rows[0]["IdDocente"];
            DocenteRitorno.Nome = dt.Rows[0]["Nome"].ToString();
            DocenteRitorno.Cognome = dt.Rows[0]["Cognome"].ToString();
            return DocenteRitorno;
        }
    }
}